package com.chenxin.interact.handler.sapHandler;

import com.chenxin.common.utils.ConvertUtils;
import com.chenxin.common.utils.StringUtils;
import com.chenxin.interact.domain.sapToWms.SapToWmsItem;
import com.chenxin.interact.domain.UrlMap;
import com.chenxin.interact.domain.dto.SapItemDTO;
import com.chenxin.interact.domain.sapDetail.BomItem;
import com.chenxin.interact.domain.sapDetail.SapIsDate;
import com.chenxin.interact.domain.sapDetail.SapIsPageControl;
import com.chenxin.interact.domain.sapDetail.SapIsReq;
import com.chenxin.interact.domain.sapResponse.SapBomResponse;
import com.chenxin.interact.service.ISapToWmsItemService;
import com.chenxin.wms.domain.SpuEntity;
import com.chenxin.wms.service.ISpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Base64Utils;
import org.springframework.web.reactive.function.client.WebClient;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Component
public class BomRequest {
    @Autowired
    private ISapToWmsItemService sapToWmsItemService;
    @Autowired
    private ISpuService spuService;

    @Transactional
    public void bomRequestFromSap(UrlMap urlMap, int pageNo) {
        // 构建一个ItemDTO实体类
        SapItemDTO sapItemDTO = new SapItemDTO();
        SapIsReq isReq = new SapIsReq();
        isReq.setReqKeyId("20250914");
        isReq.setSndPrn("紫光WMS");
        isReq.setRcvPrn("SAP");
        sapItemDTO.setIsReq(isReq);
        SapIsPageControl pageControl = new SapIsPageControl();
        pageControl.setPageLines(100);
        pageControl.setPageNo(pageNo);
        sapItemDTO.setIsPageControl(pageControl);
        SapIsDate isDate = new SapIsDate();
        isDate.setFromDate("20200101");
        isDate.setEndDate("20250830");
        sapItemDTO.setIsDate(isDate);
        SapItemDTO.IsMatNo isMatNo = new SapItemDTO.IsMatNo();
        sapItemDTO.setIsMatNo(isMatNo);
        // 1.构建WebClient
        WebClient client = WebClient.builder()
                .baseUrl(urlMap.getUrlAdr())
                .defaultHeader(HttpHeaders.AUTHORIZATION, basicAuthHeader(urlMap.getUsername(), urlMap.getPassword()))
                .build();
        // 2.发送POST请求
        SapBomResponse response = client.post()
                .uri(urlMap.getUriAdr())
                .bodyValue(sapItemDTO)
                .retrieve()
                .bodyToMono(SapBomResponse.class)
                .block();
        // 3.将接收到的物料信息写入数据库
        assert response != null;
        Date workDate = new Date();
        List<BomItem> itemList = response.getItData().getItems();
        // 已存在的BOM，直接更新
        List<SapToWmsItem> updateItemList = new ArrayList<>();
        List<SpuEntity> updateSpuList = new ArrayList<>();
        // 新增BOM，直接写入
        List<SapToWmsItem> insertItemList = new ArrayList<>();
        List<SpuEntity> insertSpuList = new ArrayList<>();
        // 处理itemList
        for (BomItem item : itemList) {
            // 处理每一条物料信息
            String matnr = item.getMatnr();
            String ztdLine = item.getZtdLine();
            if (ztdLine.contains("停产") || ztdLine.contains("失效")) {
                continue;
            }
            if (StringUtils.isEmpty(matnr)) {
                continue;
            }
            SapToWmsItem updateItem = sapToWmsItemService.selectSapToWmsItemByMatnr(matnr);
            // 4.1.物料已存在接口表中则不再写入（仅更新）
            if (updateItem != null) {
                updateItem.setMtart(item.getMtart());
                updateItem.setZtdLine(ztdLine);
                updateItem.setMaktx(item.getMaktx());
                updateItem.setMeins(item.getMeins());
                updateItem.setSpart(item.getSpart());
                updateItem.setMstae(item.getMstae());
                updateItem.setZggcs(item.getZggcs());
                updateItem.setErsda(item.getErsda());
                updateItem.setLaeda(item.getLaeda());
                updateItem.setWerks(item.getWerks());
                updateItem.setZIndex(item.getZIndex());
                updateItem.setComments("物料更新");
                updateItem.setUpdater(100L);
                updateItem.setUpdateDate(workDate);
                updateItemList.add(updateItem);
            } else {
                SapToWmsItem insertItem = ConvertUtils.sourceToTarget(item, SapToWmsItem.class);
                insertItem.setCreator(100L);
                insertItem.setCreateDate(workDate);
                insertItemList.add(insertItem);
            }
            SpuEntity updateSpu = spuService.selectSpuBySpuNo(matnr);
            // 4.2.物料已存在SPU表中则不再写入（仅更新）
            if (updateSpu != null) {
                // 更新内容：物料类型-MTART、描述-MAKTX、长文本-ZTDLINE、计量单位-MEINS、规格参数-ZGGCS、工厂-WERKS、序号
                updateSpu.setSpuType(item.getMtart());
                updateSpu.setSpuName(item.getMaktx());
                updateSpu.setSpuDesc(ztdLine);
                updateSpu.setSpuUnit(item.getMeins());
                updateSpu.setSpuSpec(item.getZggcs());
                updateSpu.setWerks(item.getWerks());
                updateSpu.setUpdater(100L);
                updateSpu.setUpdateDate(workDate);
                updateSpuList.add(updateSpu);
            } else {
                SpuEntity newSpu = new SpuEntity();
                newSpu.setSpuNo(item.getMatnr());
                newSpu.setSpuType(item.getMtart());
                newSpu.setSpuName(item.getMaktx());
                newSpu.setSpuDesc(ztdLine);
                newSpu.setSpuUnit(item.getMeins());
                newSpu.setSpuSpec(item.getZggcs());
                newSpu.setWerks(item.getWerks());
                newSpu.setCreator(100L);
                newSpu.setCreateDate(workDate);
                insertSpuList.add(newSpu);
            }
        }

        // 更新物料BOM以及内部【wms_spu】信息
        if (updateItemList.size() > 0) {
            for (SapToWmsItem item : updateItemList) {
                // 更新物料BOM
                sapToWmsItemService.updateSapToWmsItem(item);
            }
        }
        if (updateSpuList.size() > 0) {
            for (SpuEntity spu : updateSpuList) {
                spuService.updateSpu(spu);
            }
        }
        // 写入接口数据
        if (insertItemList.size() > 0) {
            for (SapToWmsItem item : insertItemList) {
                // 插入物料BOM
                sapToWmsItemService.insertSapToWmsItem(item);
            }
        }
        // 写入内部【wms_spu】数据
        if (insertSpuList.size() > 0) {
            for (SpuEntity spu : insertSpuList) {
                spuService.insertSpu(spu);
            }
        }
        System.out.println("处理Index【" + pageNo + "】");
    }

    private String basicAuthHeader(String username, String password) {
        String auth = username + ":" + password;
        String encodedCredentials = Base64Utils.encodeToString(auth.getBytes(StandardCharsets.UTF_8));
        return "Basic " + encodedCredentials;
    }
}
